package cn.cyh.imeans.utils;

import cn.cyh.imeans.constant.Const;
import com.xiaoleilu.hutool.date.DateTime;
import com.xiaoleilu.hutool.date.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;

import java.util.Map;

/**
 * 身份证号处理工具类
 */
public class SfzhUtil {

    private static final int EIGHTEEN = 18;
    private static final int FIFTEEN = 15;
    public static final String ZHANGFU = "丈夫";
    public static final String QIZI = "妻子";

    private SfzhUtil() {
    }

    /**
     * 根据身份证获取年龄
     *
     * @param sfzh 身份证号
     * @return 年龄
     */
    public static int age(String sfzh) {
        if (sfzh == null || sfzh.length() == 0) {
            return -1;
        }
        int len = sfzh.length();
        if (len == EIGHTEEN) {
            String birthday = sfzh.substring(6, 14);
            DateTime brith = DateUtil.parse(birthday, "yyyyMMdd");
            return DateUtil.age(brith, DateUtil.date());
        } else if (len == FIFTEEN) {
            String birthday = "19" + sfzh.substring(6, 12);
            DateTime brith = DateUtil.parse(birthday, "yyyyMMdd");
            return DateUtil.age(brith, DateUtil.date());
        }
        return -1;
    }

    /**
     * 获取配偶的关系
     *
     * @param sfzh 配偶的身份证号
     * @return 配偶的关系
     */
    public static String poRelation(String sfzh) {
        if (StrUtil.isBlank(sfzh)) {
            return null;
        }
        int len = sfzh.length();
        if (len == EIGHTEEN) {
            int c = sfzh.charAt(16) % 2;
            return c == 1 ? ZHANGFU : QIZI;
        } else if (len == FIFTEEN) {
            int c = sfzh.charAt(14) % 2;
            return c == 1 ? ZHANGFU : QIZI;
        }
        return null;
    }

    /**
     * 通过身份证号获取性别
     *
     * @param sfzh  身份证号
     * @param xbMap 性别字典
     * @return 性别名称
     */
    public static String[] getXb(String sfzh, Map<String, String> xbMap) {
        int xb = 0;
        if (StrUtil.isNotBlank(sfzh) && sfzh.length() == 18) {
            xb = sfzh.charAt(16);
        } else if (StrUtil.isNotBlank(sfzh) && sfzh.length() == 15) {
            xb = sfzh.charAt(14);
        }
        String xbmc = xb % 2 == 1 ? "男" : "女";
        return new String[]{xbmc, xbMap.get(xbmc)};
    }

    /**
     * 通过身份证号获取户籍地
     *
     * @param sfzh  身份证号
     * @param hjMap 行政区划字典(户籍地包含省市县三级的数据，且户籍地值包含代码和名称)
     * @return 户籍地=户籍地代码，户籍地
     */
    public static String[] getHjd(String sfzh, Map<String, String> hjMap) {
        String hjdm = null;
        String hjd = null;
        if (StrUtil.isNotBlank(sfzh) && sfzh.length() >= Const.QUHUA_LEN) {
            hjdm = sfzh.substring(0, Const.QUHUA_LEN);
            hjd = hjMap.get(hjdm);
            //获取不到，则获取省市级代码
            if (StrUtil.isBlank(hjd)) {
                hjdm = sfzh.substring(0, 4);
                hjd = hjMap.get(hjdm);
            }
            //仍然获取不到，则获取省级代码
            if (StrUtil.isBlank(hjd)) {
                hjdm = sfzh.substring(0, 2);
                hjd = hjMap.get(hjdm);
            }
            if (StrUtil.isNotBlank(hjd)) {
                String[] split = hjd.split(Const.DM_MC_SPLIT);
                hjdm = split[0];
                if (split.length > 1) {
                    hjd = split[1];
                }
            }
        }
        return new String[]{hjdm, hjd};
    }

    public static String getXbBySfzh(String sfzh) {

        //性别处理  根据身份证倒数判断   奇数为男  偶数为女
        if (sfzh.length() == 15) {
            if (sfzh.charAt(14) % 2 == 0) {
                return "女";
            } else if (sfzh.charAt(14) % 2 == 1) {
                return "男";
            }
        }
        //对男 女 进行分类(18号身份证号通过倒第二位是否为偶数来确定是否为女)
        else if (sfzh.length() == 18) {
            if (sfzh.charAt(16) % 2 == 0) {
                return "女";
            } else if (sfzh.charAt(16) % 2 == 1) {
                return "男";
            }
        }
        return null;
    }
}
